// 接收express 模块
const express = require('express')

// const hostname = '127.0.0.1';
// const port = 80;

// 创建web服务器
const app = express()



// 配置解析表单数据的中间件
// app.use(express.urlencoded({ extended: true }))

// 通过 express.json() 这个中间件，解析表单中的 JSON 格式的数据
app.use(express.json())


// 一定要在路由之前，配置cors这个中间件，从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())

// 托管静态资源
app.use(express.static('./public'))

// 一定要在路由之前， 封装res.cc函数
app.use((req, res, next) => {
  // status 默认值为1，表示失败的情况
  // err 的值，可能是一个人错误对象，也可能是错误的描述字符串
  res.cc = function(err, status = 1) {
    res.send({
      status,
      // 判断是否是 错误对象 是/返回err.message 否/返回err字符串
      message: err instanceof Error ? err.message : err
    })
  }
  next()
})

// jwt认证
//  一定要在路由配置之前 token的中间件
// const expressJWT = require('express-jwt')
// // 导入配置文件
// const config = require('./config')
// // 使用 .unless({path: [/^\/api\//]}) 指定 /api 的接口不需要进行token 的身份认证
// app.use(expressJWT({ secret: config.jwtSecretkey }).unless({path: [/^\/api\//]}))

// session认证
// const session = require('express-session')
// app.use(
//   session({
//     secret: 'cjxNB',
//     resave: false,
//     saveUninitialized: true
//   })
// )


// 导入 用户user 路由模块
const userRouter = require('./router/user.js')
// 使用app.use 注册 用户user路由模块
app.use('/api', userRouter)


// 导入 用户userInfo 路由模块
// const userInfoRouter = require('./router/userInfo')
// // 使用app.use 注册 用户userInfo路由模块
// app.use('/my', userInfoRouter)


// 导入 狼人杀角色 路由模块
const roomRouter = require('./router/room.js')
// 使用app.use 注册 用户user路由模块
app.use('/room', roomRouter)

// npm i @hapi/joi@17.1.0 包，为表单中携带的每个数据项，定义验证规则
const joi = require('joi')
//错误 中间件 全局错误级别中间件，捕获验证失败的错误，并把验证失败的结果响应给客户端
app.use((err, req, res, next) => {
  // 数据验证失败
  if (err instanceof joi.ValidationError) return res.cc(err)

  // token验证失败导致的错误
  if (err.name === 'UnauthorizedError') return res.cc('身份认证失败！')

  // 未知错误
  res.cc(err)
})

// 打开服务器
app.listen(80, () => {
  console.log(`Server running at http://127.0.0.1`);
});